package cn.bobohost.market.web.controller;

import cn.bobohost.market.common.pojo.ResultDto;
import cn.bobohost.market.common.pojo.ResultPageDto;
import cn.bobohost.market.pojo.User;
import cn.bobohost.market.service.UserDemoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户的Controller
 */
@RestController
//请求映射：如果放到类上，那么将来请求的时候，规则：类上的这个路径+方法上的路径。因此我们可以抽取前缀，一般不同模块有不同前缀
@RequestMapping("/userdemo")
public class UserDemoController {

    /**
     * @Autowired：Spring容器自动将service对象注入到Controller中
     * 所说的依赖注入DI（必须依赖于IoC容器），双方对象都在Spring的容器中。
     * 默认是根据类的类型来注入。
     */
    @Autowired
    private UserDemoService userDemoService;

    /**
     * 所有Controller的路径不能重复
     * @param user
     * @return
     */
    @PostMapping
    public ResultDto add(@RequestBody User user){
        //服务端控制台打印
//        System.out.println(user);
        //alt+回车，出现自动创建方法的提示
        userDemoService.saveUser(user);
        //返回结果给客户端
        return ResultDto.success("保存成功",null);
    }

    /**
     * 更新用户
     * @param user 用来封装数据的消息体
     * @param id 用户的唯一编号
     * @return
     */
    @PutMapping("/{id}")
    public ResultDto update(@RequestBody User user,@PathVariable("id") Integer id){
        //服务端控制台打印
//        System.out.println(user);
        //将id塞进user
        user.setId(id);
        //调用业务层
        userDemoService.updateUser(user);
        //返回结果给客户端
        return ResultDto.success("修改成功",null);
    }

    /**
     * 删除
     * 客户端：/user/1
     * @param id
     * @return
     */
    @DeleteMapping("/{id}")
    public ResultDto remove(@PathVariable Integer id){
//        System.out.println(id);
        //调用业务层
        userDemoService.deleteUserById(id);

        //返回结果给客户端
        return ResultDto.success("删除成功",null);
    }

    /**
     * 查询所有的用户列表
     * @return
     */
    @GetMapping
    public ResultDto list(){
//        List<User> userList =new ArrayList<>();
//        //添加元素---自己模拟两个用户
//        User user1 =new User();
//        user1.setId(1);
//        user1.setUserName("Rose");
//        user1.setAge(18);
//
//        User user2 =new User();
//        user2.setId(2);
//        user2.setUserName("Jack");
//        user2.setAge(88);
//
//        //将用户添加到列表
//        userList.add(user1);
//        userList.add(user2);


        //主动制造异常：
        // 1)触发jdk内置的异常
//        int d =1/0;

        //2) 主动抛出异常
        //欺骗了编译器
//        if(true){
//            throw new RuntimeException("我主动制造的异常");
//        }


        //捕捉处理异常：try如果有异常，就抓取；
        //try是用来捕获
//        try {
//            List<User> userList =new ArrayList<>();
//            //添加元素---自己模拟两个用户
//            User user1 =new User();
//            user1.setId(1);
//            user1.setUserName("Rose");
//            user1.setAge(18);
//
//            User user2 =new User();
//            user2.setId(2);
//            user2.setUserName("Jack");
//            user2.setAge(88);
//
//            //将用户添加到列表
//            userList.add(user1);
//            userList.add(user2);
//            //制造异常
////            int d =1/0;
//             if(true){
//            throw new RuntimeException("我主动制造的异常");
//        }
//            //返回列表
//            return ResultDto.success("查询成功",userList);
//         //catch是用来抓取特定异常，可以处理.异常只能抓同样的或比自己辈分小的异常。
////        }catch (ArithmeticException e){
//        }catch (Exception e){
//            System.out.println("出现了异常："+e.getMessage());
//            return ResultDto.error(50000,"查询失败");
//        }

//        UserDemoService userDemoService=new UserDemoServiceImpl();
        List<User> userList = userDemoService.findUserList();

        //返回列表
        return ResultDto.success("查询成功",userList);
    }


    /**
     * 根据id查询一个用户
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public ResultDto getById(@PathVariable Integer id){
//        System.out.println(id);
//
//        User user1 =new User();
//        user1.setId(id);
//        user1.setUserName("Rose");
//        user1.setAge(18);

        //调用业务层
//        User user=userDemoService.findUserById(id);

        User user=userDemoService.findUserByIdCust(id);

        return ResultDto.success("查询成功",user);
    }


    /**
     * 根据用户名模糊查询
     * @param userName
     * @return
     */
    @GetMapping("/username/{userName}")
    public ResultDto listByUserNameLike(@PathVariable String userName){
        return ResultDto.success("查询成功"
                //调用业务cent
                ,userDemoService.findUserListByUserNameLike(userName));
    }

    /**
     * 根据年龄和姓名查询
      * @param age
     * @param userName
     * @return
     */
    @GetMapping("/username/{userName}/age/{age}")
    public ResultDto listByAgeGte(@PathVariable Integer age,@PathVariable String userName){
        return ResultDto.success("查询成功"
                //调用业务cent
                ,userDemoService.findUserListByAgeGte(age,userName));
    }

    /**
     * 分页结果查询
     * @param user
     * @param pageNum
     * @param pageSize
     * @return
     */
    @PostMapping("/page/{pageNum}/{pageSize}")
    public ResultDto listPage(@RequestBody User user,@PathVariable int pageNum,@PathVariable int pageSize){
        ResultPageDto<User> userResultPageDto = userDemoService.findUserListPage(user, pageNum, pageSize);
        return ResultDto.success("查询成功",userResultPageDto);
    }

}
